home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
gnu
/
libg_261.zip
/
libg_261
/
libg++
/
proto-kit
/
prototype
< prev
next >
Wrap
Text File
|
1991-06-28
|
4KB
|
177 lines
#!/usr/local/bin/gawk -f
#
# types: types[x] = 1 for each type 'x' we have completed. 'x' has separators
#
# prototypes:
# prototypes[x] = the number of dependent types
# (x is base type string -- without variables. eg. AVLMap)
# prototypes[x,"variables"] = the type string with period separated variables
# prototypes[x,y] = a dependent type (y integer)
#
# lib_prototype[x] = 1
# user_prototype[x] = 1
# "x" is base type string (eg. AVLMap)
#
# queue: queue of types to be done (with period separators)
# head: head of queue (where types added)
# tail: tail of queue (where types are processed)
#
#
# get_template
#
function get_template (template_string, instance, res, t_count, t_elements, i_count, i_elements, i) {
t_count = split (template_string, t_elements, ".");
i_count = split (instance, i_elements, ".");
for (i = 1 ; i < i_count ; i ++)
{
if (i > 1) res = (res ",");
res = (res t_elements[i] "." i_elements[i]);
}
return res;
}
#
# transform: takes an array of the form vars[variable] = value, and returns
# the instantiation of those variables according to template.
# "variable" is of the form <xxx>
#
function transform (vars, template, res, pairs, map, count, i, var, preamble, postamble) {
res = template;
count = split(vars, pairs, ",");
for (i = 1 ; i <= count ; i++)
{
split(pairs[i],map,".");
if (match(map[1],"<.+>") > 0)
{
var = substr(map[1],RSTART,RLENGTH);
if (RSTART > 1)
preamble = substr(map[1],1,RSTART);
if (RSTART + RLENGTH < length(map[1]))
postamble = substr(map[1],RSTART+RLENGTH);
if (match(map[2],("^" preamble ".*" postamble "$")) > 0)
{
match(map[2],("^" preamble));
if (RLENGTH > 0)
map[2] = substr(map[2],RSTART+RLENGTH);
match(map[2],(postamble "$"));
if (RLENGTH > 0)
map[2] = substr(map[2],1,RSTART-1);
gsub(var, map[2], res);
}
}
}
return res;
}
function is_basic (t) {
if (basic_types[t] == 1)
return 1;
return 0;
}
function add_type (t, c, e) {
c = split(t,e,".");
if ((is_basic(t) != 0) || (t ~ /_p$/) || (c <= 1))
return 0;
if (match(t,"<.*>") > 0)
return 0;
types[t] = 1;
return 1;
}
function get_prototype (type, count, names) {
count = split(type, names, ".");
return names[count];
}
BEGIN {
head = 1;
tail = 1;
}
($1 == "basic-type") || ($1 == "libg++-type") || ($1 == "user-type") {
if ($1 == "basic-type")
basic_types[$2] = 1 ;
if ($1 == "libg++-type")
lib_types[$2] = 1;
if ($1 == "user-type")
{
add_type($2);
user_types[$2] = 1 ;
for (i = 3 ; i <= NF ; i++)
if (add_type($i) > 0)
{
queue[head] = $i;
head ++;
}
}
}
($1 == "libg++-prototype") || ($1 == "user-prototype") {
proto = get_prototype($2);
prototypes[proto] = NF - 2;
prototypes[proto,"variables"] = $2;
if ($1 == "libg++-prototype")
lib_prototypes[proto] = 1;
if ($1 == "user-prototype")
user_prototypes[proto] = 1;
for (i = 3 ; i <= NF ; i ++)
prototypes[proto,i - 2] = $i;
}
$1 == "instantiate" {
if (add_type($2) > 0)
{
queue[head] = $2;
head ++;
}
}
END {
while (head > tail)
{
count = split(queue[tail], elements, ".");
template = get_template(prototypes[elements[count],"variables"], queue[tail]);
for (i = 1 ; i <= prototypes[elements[count]] ; i ++)
{
t = transform(template, prototypes[elements[count],i]);
if (add_type(t))
{
queue[head] = t;
head++;
}
}
tail ++;
}
for (t in types)
if (types[t] == 1)
{
proto = get_prototype(t);
if ((output_type == "libg++-prototypes") && (lib_prototypes[proto] == 1))
print t;
if ((output_type == "user-prototypes") && (user_prototypes[proto] == 1))
print t;
}
if (output_type == "libg++-types")
for (t in lib_types)
print t;
if (output_type == "user-types")
for (t in user_types)
print t;
}